/**══════════════════════════════════╗
*作    者：songbaobao                                                 ║
*职    业：我以我血荐轩辕                                              ║
*CSND地址：https://blog.csdn.net/weixin_43949535                       ║
**GitHub ：https://github.com/TsinghuaLucky912/My_own_C-_study_and_blog║
**GitEE  ：https://gitee.com/lucky912_admin/code-up_-pat               ║
*═══════════════════════════════════╣
*创建时间：                                                           
*功能描述：                                                            
*                                                                      
*                                                                      
*═══════════════════════════════════╣
*结束时间:                                                           
*═══════════════════════════════════╝
//                .-~~~~~~~~~-._       _.-~~~~~~~~~-.
//            __.'              ~.   .~              `.__
//          .'//              西南\./联大               \\`.
//        .'//                     |                     \\`.
//      .'// .-~"""""""~~~~-._     |     _,-~~~~"""""""~-. \\`.
//    .'//.-"                 `-.  |  .-'                 "-.\\`.
//  .'//______.============-..   \ | /   ..-============.______\\`.
//.'______________________________\|/______________________________`.
*/
#include "main.h"


/*
* 使用双缓冲绘图
*/
void gameInit(vector<vector<int>>& mymap)
{
	BeginBatchDraw();

	// 绘制主窗口，及加载背景图片
	mainWindow();

	// 绘制游戏主区域窗口，及加载图片
	gameWindow();

	// 绘制游戏主区域窗口内数字，及加载对应图片
	digitWindow(mymap);

	EndBatchDraw();
}

#if 0
// 绘制游戏主区域 4*4
void gameWindow1()
{
	for (int i = 1; i <= GRIDNUM; ++i)
	{
		for (int j = 1; j <= GRIDNUM; ++j)
		{
			solidrectangle(j * GAPLENGTH + (j - 1) * GRIDLENGTH, i * GAPLENGTH + (i - 1) * GRIDLENGTH,
				j * (GAPLENGTH + GRIDLENGTH), i * (GAPLENGTH + GRIDLENGTH));
		}
	}
}
#endif

/*
* 随机产生 2 or 4
*/
void srandTwoOrFour(vector<vector<int>>& mymap)
{
	srand((unsigned int)time(nullptr));

	int value = rand() % 4;// 25% 是 4
	for (int i = 0; i < 1;)
	{
		int r = rand() % GRIDNUM;
		int c = rand() % GRIDNUM;

		if (mymap[r][c] == 0)
		{
			mymap[r][c] = value == 0 ? 4 : 2;
			++i;
		}
	}
}

/*
* 上下左右移动以及逻辑控制
*/
bool gameControl(vector<vector<int>>& mymap)
{
#if 0
	// 下面方法有问题

	/* 使用Windows的系统API 非阻塞函数 GetAsyncKeyState */
	if ((GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')))
	{
		moveUpWard(mymap);
		return true;
	}
	else if ((GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')))
	{
		return true;
	}
	else if ((GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')))
	{
		return true;
	}
	else if ((GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')))
	{
		return true;
	}
#endif

	bool flag = false;
	//如果有按键按下，则_kbhit()函数返回真
	if (_kbhit())
	{
		int ch = getch();// 上、下、左、右键是双字节编码，敲一下键就输入2个字节，而getch一次只接收一个字节
		char cmd = getch();//使用_getch()函数获取按下的键值

		switch (cmd)
		{
			// Up
		//case 'w':
		//case 'W':
		case 72:// ↑ 
			flag = moveUpWard(mymap);
			break;

			// Down
		//case 's':
		//case 'S':
		case 80:
			flag = moveDownWard(mymap);
			break;

			// Left
		//case 'a':
		//case 'A':
		case 75:
			flag = moveLeftWard(mymap);
			break;

			// Right
		//case 'd':
		//case 'D':
		case 77:
			flag = moveRightWard(mymap);
			break;
		default:
			break;
		}
	}

	return flag;	
}

/*
* 向上移动 从第二行开始 
* 
* 每一列只加一次
*/
bool moveUpWard(vector<vector<int>>& mymap)
{
	bool flag = false;
	// 4列 或 4次
	for (int col = 0; col < GRIDNUM; ++col)
	{
		int index = 0;// 代表当前指向的行

		// 遍历行
		for (int row = 1; row < GRIDNUM; ++row)
		{
			// 下一行的这个空格有数据，才有移动的意义
			if (mymap[row][col] != 0)
			{
				// 它的头上(指向的这个)是空的 移动
				if (0 == mymap[index][col])
				{
					mymap[index][col] = mymap[row][col];
					mymap[row][col] = 0;
					flag = true;
				}
				// 它头上的数据和它一样 相加
				else if (mymap[row][col] == mymap[index][col])
				{
					mymap[index++][col] *= 2;
					mymap[row][col] = 0;
					flag = true;
				}
				// 它头上的数据和它不一样
				else
				{
					int newrow = index + 1;
					mymap[newrow][col] = mymap[row][col];
					if (index + 1 != row)
					{
						mymap[row][col] = 0;
						flag = true;
					}
					index++;
				}
			}
		}
	}
	return flag;
}

/*
* 向下移动 从倒数第二行开始
*
* 每一列只加一次
*/
bool moveDownWard(vector<vector<int>>& mymap)
{
	bool flag = false;
	// 4列 或 4次
	for (int col = 0; col < GRIDNUM; ++col)
	{
		int index = 3;// 代表当前指向的行

		// 遍历行
		for (int row = 2; row > -1; --row)
		{
			// 上一行的这个空格有数据，才有移动的意义
			if (mymap[row][col] != 0)
			{
				// 它的下面(指向的这个)是空的 移动
				if (0 == mymap[index][col])
				{
					mymap[index][col] = mymap[row][col];
					mymap[row][col] = 0;
					flag = true;
				}
				// 它下面的数据和它一样 相加
				else if (mymap[row][col] == mymap[index][col])
				{
					mymap[index--][col] *= 2;
					mymap[row][col] = 0;
					flag = true;
				}
				// 它头上的数据和它不一样
				else
				{
					int newrow = index - 1;
					mymap[newrow][col] = mymap[row][col];
					if (index - 1 != row)
					{
						mymap[row][col] = 0;
						flag = true;
					}
					index--;
				}
			}
		}
	}
	return flag;
}

/*
* 向左移动 从第二列开始
*
* 每一行只加一次
*/
bool moveLeftWard(vector<vector<int>>& mymap)
{
	bool flag = false;
	// 4行 或 4次
	for (int row = 0; row < GRIDNUM; ++row)
	{
		int index = 0;// 代表当前指向的列

		// 遍历列
		for (int col = 1; col < GRIDNUM; ++col)
		{
			// 右边一列的这个空格有数据，才有移动的意义
			if (mymap[row][col] != 0)
			{
				// 它的左边(指向的这个)是空的 移动
				if (0 == mymap[row][index])
				{
					mymap[row][index] = mymap[row][col];
					mymap[row][col] = 0;
					flag = true;
				}
				// 它左边的数据和它一样 相加
				else if (mymap[row][col] == mymap[row][index])
				{
					mymap[row][index++] *= 2;
					mymap[row][col] = 0;
					flag = true;
				}
				// 它左边的数据和它不一样
				else
				{
					int newcol = index + 1;
					mymap[row][newcol] = mymap[row][col];
					if (index + 1 != col)
					{
						mymap[row][col] = 0;
						flag = true;
					}
					index++;
				}
			}
		}
	}
	return flag;
}

/*
* 向右移动 从倒数第二列开始
*
* 每一行只加一次
*/
bool moveRightWard(vector<vector<int>>& mymap)
{
	bool flag = false;
	// 4行 或 4次
	for (int row = 0; row < GRIDNUM; ++row)
	{
		int index = 3;// 代表当前指向的列

		// 遍历列
		for (int col = 2; col > -1; --col)
		{
			// 左边一列的这个空格有数据，才有移动的意义
			if (mymap[row][col] != 0)
			{
				// 它的右边(指向的这个)是空的 移动
				if (0 == mymap[row][index])
				{
					mymap[row][index] = mymap[row][col];
					mymap[row][col] = 0;
					flag = true;
				}
				// 它右边的数据和它一样 相加
				else if (mymap[row][col] == mymap[row][index])
				{
					mymap[row][index--] *= 2;
					mymap[row][col] = 0;
					flag = true;
				}
				// 它右边的数据和它不一样
				else
				{
					int newcol = index - 1;
					mymap[row][newcol] = mymap[row][col];
					if (index - 1 != col)
					{
						mymap[row][col] = 0;
						flag = true;
					}
					index--;
				}
			}
		}
	}
	return flag;
}

bool gameTestWinOrContinue(vector<vector<int>>& mymap)
{
	for (vector<vector<int>>::iterator it1 = mymap.begin(); it1 != mymap.end(); ++it1)
	{
		for (vector<int>::iterator it2 = it1->begin(); it2 != it1->end(); ++it2)
		{
			if (2048 == *it2)
				return true;
		}
	}

	// 没有到 继续加油
	return false;
}
/**
*备用注释：
*
*
*
*/
